home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 23 / AACD 23.iso / AACD / Programming / tek / kn / sockcommon / createclientsock.c < prev    next >
Encoding:
C/C++ Source or Header  |  2001-05-12  |  2.2 KB  |  103 lines

  1. /*
  2. **
  3. **    knsocket = kn_createclientsock(mmu, remotename, timer, timeout)
  4. **
  5. **    create client socket (msgport proxy scenario), 
  6. **    connected to a remote name.
  7. **
  8. **    messages with a reply expected that do not return within the
  9. **    timeout period will be abandoned, and replied locally with
  10. **    TMSG_STATUS_FAILED. a timeout of 0 means "no timeout".
  11. **
  12. */
  13.  
  14. TAPTR kn_createclientsock(TAPTR mmu, knsockobj *remotename, TKNOB *timer, TTIME *timeout)
  15. {
  16.     TBOOL success = TFALSE;
  17.  
  18.     struct knclientsocket *s = TMMUAlloc(mmu, sizeof(struct knclientsocket));
  19.     if (s)
  20.     {
  21.         kn_sockenv_t *sockenv = &s->sockenv;
  22.         if (kn_getsockenv(sockenv))
  23.         {
  24.             kn_locksock(sockenv);
  25.         
  26.             s->desc = socket(PF_INET, SOCK_STREAM, 0);
  27.             if (s->desc >= 0)
  28.             {
  29.                 if (connect(s->desc, (struct sockaddr *) remotename, sizeof(struct sockaddr_in)) == 0)
  30.                 {
  31.                     char *d, *t;
  32.                     int i;
  33.                     struct knclinode *cnode;
  34.  
  35.                     kn_socknonblocking(s->desc);
  36.     
  37.                     s->remotename = remotename;
  38.                     s->mmu = mmu;
  39.                     s->msgID = 0;
  40.                     s->status = SOCKSTATUS_CONNECTED;
  41.                     s->clientnode = TNULL;
  42.                     s->bytesdone = 0;
  43.                     s->timer = timer;
  44.                     s->msgtimeout = TTIMETOF(timeout);
  45.         
  46.                     FD_ZERO(&s->readset);
  47.                     FD_ZERO(&s->writeset);
  48.                     
  49.                     TInitList(&s->freelist);
  50.                     TInitList(&s->readlist);
  51.                     TInitList(&s->writelist);
  52.                     TInitList(&s->deliverlist);
  53.             
  54.                     cnode = s->nodebuf;
  55.                     for (i = 0; i < KNSOCK_MAXPENDING; ++i)
  56.                     {
  57.                         TAddTail(&s->freelist, (TNODE *) cnode);
  58.                         cnode++;
  59.                     }
  60.  
  61.                     /*    generate dummy netmsg node with sender name string 
  62.                         (will be common to all client nodes) */
  63.                     
  64.                     s->netmsg.backptr = TNULL;
  65.                     s->netmsg.sendername = s->remotename;
  66.  
  67.                     t = kn_getsockname(remotename);
  68.                     d = s->netmsg.symbolicname;
  69.                     while ((*d++ = *t++));
  70.                     *(d - 1) = ':';
  71.                     kn_itoa((int) kn_getsockport(remotename), d);
  72.  
  73.                     success = TTRUE;
  74.  
  75.                 }
  76.                 else
  77.                 {
  78.                     dbsprintf(10, "*** TEKLIB kn_createclientsock: connect()\n");
  79.                 }
  80.  
  81.                 if (!success)
  82.                 {
  83.                     kn_closesocket(s->desc);
  84.                 }
  85.             }
  86.             else
  87.             {
  88.                 dbsprintf(20, "*** TEKLIB kn_createclientsock: socket()\n");
  89.             }
  90.  
  91.             kn_unlocksock(sockenv);
  92.         }
  93.  
  94.         if (!success)
  95.         {
  96.             TMMUFree(mmu, s);
  97.             s = TNULL;
  98.         }
  99.     }
  100.  
  101.     return (TAPTR) s;
  102. }
  103.